package old.business;

import java.util.List;

import javax.ejb.LocalBean;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;
import javax.persistence.metamodel.EntityType;

import old.entity.Pessoa;

import org.apache.log4j.Logger;


//@Stateless
//@LocalBean
public class PessoaBusiness {
	/*** LOG ***/
	private static final Logger log = Logger.getLogger(PessoaBusiness.class);

	//@PersistenceContext(unitName = "almirante")
	private EntityManager em;

	//Defaul é requisitar uma nova transação
	//@TransactionAttribute(TransactionAttributeType.)
	public void cadastrarPessoa(Pessoa pessoa) throws Exception {

		if (pessoa == null) {
			throw new Exception("parametros.invalidos");
		}
		try {
			
			Query query = em.createNamedQuery("pesquisarNome");
			query.setParameter("nome", pessoa.getNomePessoa());
			
			if (query.getResultList().size() > 0){
				throw new Exception("Erro. Pessoa já cadastrada");
			}
			
			pessoa.juridica();
			
			em.persist(pessoa);
		} catch (Exception e) {
			e.printStackTrace();
			throw new Exception(e.getMessage());
		}
	}

	public List<Pessoa> listarPessoa() throws Exception {

		return em.createNamedQuery("listarPessoas", Pessoa.class).getResultList();
	}
	
	public List<Pessoa> listarPessoaSemCarro() throws Exception {

		return em.createNamedQuery("listarPessoasSemCarro").getResultList();
	}
	
	public List<Pessoa> pesquisarPessoa(Pessoa pessoa){
		
		CriteriaBuilder cb = em.getCriteriaBuilder();  
		CriteriaQuery<Pessoa> cq = cb.createQuery(Pessoa.class);  
		Root<Pessoa> root = cq.from(Pessoa.class);  
		EntityType<Pessoa> modelo = root.getModel(); 
		
		if (pessoa.getNomePessoa() != null && !"".equals(pessoa.getNomePessoa() )){
			Predicate nome = cb.equal(root.get("nomePessoa"), pessoa.getNomePessoa());  
			cq.where(nome); 
		}
		
		Query query = em.createQuery(cq);
		List<Pessoa> result = query.getResultList();  
		
		return (List<Pessoa>) result;
	}
	
	public Pessoa obterPessoa (Integer idPessoa) throws Exception{
		
		return em.find(Pessoa.class,idPessoa);
	}
	
	public void alterarPessoa(Pessoa pessoa) throws Exception {

		em.merge(pessoa);

	}

}
